#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <thread>

// void *ThreadRun(void *args)
// {
//     std::string name = (char*)args;
//     while(true)
//     {
//         std::cout << "我是新线程，我们名称是" << name << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, ThreadRun, (void*)"Thread-1");

//     while(true)
//     {
//         std::cout << "我是主线程" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// /* c++11 线程库 */
// void *routinue()
// {
//     while(true)
//     {
//         std::cout << "我是新线程,我的PID是 " << getpid() << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t(routinue);
//     while(true)
//     {
//         std::cout << "我是主线程" << std::endl;
//         sleep(1);
//     }
//     t.join();

//     return 0;
// }

// void *routinue(void *args)
// {
//     std::string name = (const char*)args;
//     int cnt = 3;
//     while(cnt--)
//     {
//         std::cout << "我是一个新线程, 我的tid是:" << pthread_self() << std::endl;
//         sleep(1);
//     }
//     return (void*)100;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, routinue, (void*)"thread-1");
//     void* ret = nullptr;
//     sleep(5);
//     pthread_join(tid, &ret);
//     std::cout << (long long)ret << std::endl;
//     return 0;
// }

/* 对象 */
class RetObject
{
public:
    RetObject(int a, int b)
    :_a(a)
    ,_b(b)
    {}

    int Excute()
    {
        return _a + _b;
    }

    ~RetObject()
    {}
private:
    int _a;
    int _b;
};

int ret = 0;

// void *routine(void *args)
// {
//     RetObject* ro = static_cast<RetObject*>(args);
//     ret = ro->Excute();
//     std::cout << ret << std::endl;
//     sleep(5);
//     pthread_exit((void*)ret);
//     // return (void*)ret;
// }

// void *routine(void *args)
// {
//     while(true)
//     {
//         std::cout << "我是一个新线程, 我的tid是:" << pthread_self() << std::endl;
//         sleep(1);
//     }
//     return (void*)123;
// }

// int main()
// {
//     pthread_t tid;
//     RetObject* ro = new RetObject(10, 20);
//     pthread_create(&tid, nullptr, routine, (void*)ro);
//     pthread_cancel(tid);
//     void *ret = nullptr;
//     pthread_join(tid, &ret);
//     std::cout << (long long)ret << std::endl;
//     return 0;
// }